#ifndef INTERPROCESSCOMMUNICATION_H
#define INTERPROCESSCOMMUNICATION_H

#include <QObject>
#include <QUdpSocket>
#include <QTimer>
#include <QVariant>
#include "common_InterprocessCommunication.h"

class InterprocessCommunication : public QObject
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数
     * @param recvPort 接收数据的端口号
     * @param sendPort 发送数据的端口号
     * @param localIP 本地UDP通信IP地址
     * @param parent Qt父对象
     */
    InterprocessCommunication(u32 recvPort, u32 sendPort, const QString& localIP, QObject* parent = nullptr);
    ~InterprocessCommunication();

public slots:
    /**
     * @brief 发送UDP消息的公共槽函数
     * @param command 指令宏
     * @param data 需要发送的指令数据（QVariant）
     */
    void sendCommand(u8 cmdID, QVariant data);

    // 重复代码
    void writeDatagram(QByteArray message);

signals:
    /**
     * @brief 当接收到急停按钮状态时发出信号
     * @param isPressed 按键是否按下
     */
    //void buttonStateReceived(bool isPressed);

private slots:
    /**
     * @brief 读取接收到的数据报
     */
    void readPendingDatagrams();

private:
    /**
     * @brief 构造发送的协议数据
     * @param command 指令宏
     * @param data 指令的具体数据
     * @return 完整的UDP消息字节数组
     */
    QByteArray constructSendingMessage(u8 cmdID, const QVariant& data);

    // 检查校验码,第一个参数为消息整体,第二个参数为除去校验码的消息长度
    u32 processCrc32Accumulate(const u8* buf, u32 len);

    // 打印十六进制QByteArray
    void printQByteArrayHex(const QByteArray& data);


private:
    QUdpSocket* m_socket;  // UDP套接字
    u32 m_recvPort;        // 接收数据的端口
    u32 m_sendPort;        // 发送数据的端口
    QString m_localIP;     // 本地UDP通信的IP地址
};

#endif // INTERPROCESSCOMMUNICATION_H
